// Copyright (c) 2012 Ecma International.  All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
es5id: 7.6.1-4-16
description: >
    Allow global constant properties as property names by accessor function within an object.
---*/

function Test() {
    var test;

    var tokenCodes = {
        set undefined(value) { test = 'undefined'; },
        get undefined() { return 'undefined'; },
        set NaN(value) { test = 'NaN'; },
        get NaN() { return 'NaN'; },
        set Infinity(value) { test = 'Infinity'; },
        get Infinity() { return 'Infinity'; },
    };

    var arr = [
        'undefined',
        'NaN',
        'Infinity',
    ];

    for (var i = 0; i < arr.length; ++i) {
        var propertyName = arr[i];

        assert(tokenCodes.hasOwnProperty(propertyName),
               'Property "' + propertyName + '" found');

        assert.sameValue(tokenCodes[propertyName], propertyName,
                         'Property "' + propertyName + '" has correct value');

        tokenCodes[propertyName] = 0;
        assert.sameValue(test, propertyName,
                         'Property "' + propertyName + '" sets correct value');
    }
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
